package util

import (
	"adam2/internal/constants"
	"adam2/internal/model"
	"anubis-framework/pkg/util"
	"strings"
)

// 是否是一字涨停版
func OneWordLimitUp(stockTransactionDataAll model.StockTransactionDataAll, transactionDate string) bool {
	// 是否涨停
	var limitUp bool = false

	// 在2020-08-24之前，并且当上涨幅度大于等于10%，并且开盘价和开盘价相等，就表示有可能是一字涨停板
	if util.Before(transactionDate, constants.JUDGEMENT_DATE) && stockTransactionDataAll.ChangeRange >= 9.9 && stockTransactionDataAll.ClosePrice == stockTransactionDataAll.OpenPrice {
		limitUp = true
	}

	// 在2020-08-24之后，如果股票代码以300开头，并且上涨幅度大于等于20%，并且开盘价和开盘价相等，就表示有可能是一字涨停板
	if util.AfterOrEqual(transactionDate, constants.JUDGEMENT_DATE) && strings.Compare(string(stockTransactionDataAll.Code[3]), "300") == 0 && stockTransactionDataAll.ChangeRange >= 19.9 && stockTransactionDataAll.ClosePrice == stockTransactionDataAll.OpenPrice {
		limitUp = true
	}

	// 在2020-08-24之后，如果股票代码不是300开头，并且上涨幅度大于等于10%，并且开盘价和开盘价相等，就表示有可能是一字涨停板
	if util.AfterOrEqual(transactionDate, constants.JUDGEMENT_DATE) && strings.Compare(string(stockTransactionDataAll.Code[3]), "300") != 0 && stockTransactionDataAll.ChangeRange >= 9.9 && stockTransactionDataAll.ClosePrice == stockTransactionDataAll.OpenPrice {
		limitUp = true
	}

	// ST、*ST和退开头的涨幅超过5%，并且开盘价和开盘价相等，就表示有可能是一字涨停板
	if (strings.HasPrefix(stockTransactionDataAll.Code, "ST") || strings.HasPrefix(stockTransactionDataAll.Code, "*ST") || strings.HasPrefix(stockTransactionDataAll.Code, "退")) && stockTransactionDataAll.ChangeRange >= 4.9 && stockTransactionDataAll.ClosePrice == stockTransactionDataAll.OpenPrice {
		limitUp = true
	}

	// 这是最严格的标准，只要开盘价和收盘价相同，就认为是一字涨停版
	if stockTransactionDataAll.ChangeRange > 0 && stockTransactionDataAll.ClosePrice == stockTransactionDataAll.OpenPrice && stockTransactionDataAll.HighestPrice == stockTransactionDataAll.LowestPrice {
		limitUp = true
	}
	return limitUp
}

// 是否是一字跌停版
func OneWordLimitDown(stockTransactionDataAll model.StockTransactionDataAll, transactionDate string) bool {
	// 是否跌停
	var limitDown bool = false

	// 在2020-08-24之前，并且当下跌幅度大于等于10%，并且开盘价和开盘价相等，就表示有可能是一字跌停板
	if util.Before(transactionDate, constants.JUDGEMENT_DATE) && stockTransactionDataAll.ChangeRange <= -9.9 && stockTransactionDataAll.ClosePrice == stockTransactionDataAll.OpenPrice {
		limitDown = true
	}

	// 在2020-08-24之后，如果股票代码以300开头，并且下跌幅度大于等于20%，并且开盘价和开盘价相等，就表示有可能是一字跌停板
	if util.AfterOrEqual(transactionDate, constants.JUDGEMENT_DATE) && strings.Compare(string(stockTransactionDataAll.Code[3]), "300") == 0 && stockTransactionDataAll.ChangeRange <= -19.9 && stockTransactionDataAll.ClosePrice == stockTransactionDataAll.OpenPrice {
		limitDown = true
	}

	// 在2020-08-24之后，如果股票代码不是300开头，并且下跌幅度大于等于10%，并且开盘价和开盘价相等，就表示有可能是一字跌停板
	if util.AfterOrEqual(transactionDate, constants.JUDGEMENT_DATE) && strings.Compare(string(stockTransactionDataAll.Code[3]), "300") != 0 && stockTransactionDataAll.ChangeRange <= -9.9 && stockTransactionDataAll.ClosePrice == stockTransactionDataAll.OpenPrice {
		limitDown = true
	}

	// ST、*ST和退开头的跌幅超过5%，并且开盘价和开盘价相等，就表示有可能是一字跌停板
	if (strings.HasPrefix(stockTransactionDataAll.Code, "ST") || strings.HasPrefix(stockTransactionDataAll.Code, "*ST") || strings.HasPrefix(stockTransactionDataAll.Code, "退")) && stockTransactionDataAll.ChangeRange <= -4.9 && stockTransactionDataAll.ClosePrice == stockTransactionDataAll.OpenPrice {
		limitDown = true
	}

	// 这是最严格的标准，只要开盘价和收盘价相同，就认为是一字跌停版
	if stockTransactionDataAll.ChangeRange < 0 && stockTransactionDataAll.ClosePrice == stockTransactionDataAll.OpenPrice && stockTransactionDataAll.HighestPrice == stockTransactionDataAll.LowestPrice {
		limitDown = true
	}
	return limitDown
}

// 是否是炸板
func PriceLimitBreakdown(stockTransactionDataAll model.StockTransactionDataAll, transactionDate string) bool {
	// 是否炸板
	var priceLimitBreakdown bool = false

	// 在2020-08-24之前，并且当最大上涨幅度大于等于10%，并且开盘价小于最高价，就表示有可能是炸板
	if util.Before(transactionDate, constants.JUDGEMENT_DATE) && (stockTransactionDataAll.HighestPrice-stockTransactionDataAll.LastClosePrice)/stockTransactionDataAll.LastClosePrice*100 >= 9.9 && stockTransactionDataAll.ClosePrice < stockTransactionDataAll.HighestPrice {
		priceLimitBreakdown = true
	}

	// 在2020-08-24之后，如果股票代码以300开头，并且最大上涨幅度大于等于20%，并且开盘价小于最高价，就表示有可能是炸板
	if util.AfterOrEqual(transactionDate, constants.JUDGEMENT_DATE) && strings.Compare(string(stockTransactionDataAll.Code[3]), "300") == 0 && (stockTransactionDataAll.HighestPrice-stockTransactionDataAll.LastClosePrice)/stockTransactionDataAll.LastClosePrice*100 >= 19.9 && stockTransactionDataAll.ClosePrice < stockTransactionDataAll.HighestPrice {
		priceLimitBreakdown = true
	}

	// 在2020-08-24之后，如果股票代码不是300开头，并且最大上涨幅度大于等于10%，并且开盘价小于最高价，就表示有可能是炸板
	if util.AfterOrEqual(transactionDate, constants.JUDGEMENT_DATE) && strings.Compare(string(stockTransactionDataAll.Code[3]), "300") != 0 && (stockTransactionDataAll.HighestPrice-stockTransactionDataAll.LastClosePrice)/stockTransactionDataAll.LastClosePrice*100 >= 9.9 && stockTransactionDataAll.ClosePrice < stockTransactionDataAll.HighestPrice {
		priceLimitBreakdown = true
	}

	// ST、*ST和退开头的最大涨幅超过5%，并且开盘价小于最高价，就表示有可能是炸板
	if (strings.HasPrefix(stockTransactionDataAll.Code, "ST") || strings.HasPrefix(stockTransactionDataAll.Code, "*ST") || strings.HasPrefix(stockTransactionDataAll.Code, "退")) && (stockTransactionDataAll.HighestPrice-stockTransactionDataAll.LastClosePrice)/stockTransactionDataAll.LastClosePrice*100 >= 4.9 && stockTransactionDataAll.ClosePrice == stockTransactionDataAll.HighestPrice {
		priceLimitBreakdown = true
	}

	return priceLimitBreakdown
}